home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / smalltlk.lha / Smalltalk3.09 / src / muiinit.c < prev    next >
C/C++ Source or Header  |  1995-08-27  |  9KB  |  302 lines

  1. /* 
  2.     MUI initialization
  3.     written by David Faught, July 1995
  4. */
  5.  
  6. # include "muist.h"
  7. # include "env.h"
  8. # include "memory.h"
  9. # include "names.h"
  10.  
  11. #ifndef __GNUC__
  12. #include <clib/muimaster_protos.h>
  13. #else
  14. #include <inline/muimaster.h>
  15. #endif
  16.  
  17. #ifndef MAKE_ID
  18. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
  19. #endif
  20.  
  21. LONG __stack = 8192;
  22.  
  23. extern object trueobj, falseobj;
  24. extern boolean parseok;
  25. extern int initial;
  26.  
  27. struct Library *MUIMasterBase;
  28.  
  29. /* windows are maintained in a single structure */
  30. APTR wins[WINDOWMAX];
  31.  
  32. /* A little array definition */
  33. const char LVT_STinit[] =
  34. "Little Smalltalk version 3 by Timothy Budd.\nAmiga interface by David Faught.\nMUI - MagicUserInterface Copyright © 1993-94 Stefan Stuntz.";
  35.  
  36. /* Conventional GadTools NewMenu structures for menus */
  37. struct NewMenu mainMenu[] =
  38. {
  39.     { NM_TITLE, "Project"  , 0 ,0,0,(APTR)0            },
  40.     { NM_ITEM , "About..." ,"?",0,0,(APTR)ID_ABOUT     },
  41.     { NM_ITEM , "Browser"  ,"B",0,0,(APTR)ID_BROWSE    },
  42.     { NM_ITEM , "fileIn"   ,"I",0,0,(APTR)ID_FILEIN    },
  43.     { NM_ITEM , "fileOut"  ,"O",NM_ITEMDISABLED,0,(APTR)ID_FILEOUT   },
  44.     { NM_ITEM , "saveImage","S",0,0,(APTR)ID_SAVEIMG   },
  45.     { NM_ITEM , NM_BARLABEL, 0 ,0,0,(APTR)0            },
  46.     { NM_ITEM , "Quit"     ,"Q",0,0,(APTR)MUIV_Application_ReturnID_Quit },
  47.     { NM_TITLE, "Edit"     , 0 ,NM_MENUDISABLED,0,(APTR)0            },
  48.     { NM_ITEM , "addClass" ,"C",0,0,(APTR)ID_ADDCLS    },
  49.     { NM_ITEM , "addMethod","M",0,0,(APTR)ID_ADDMTH    },
  50.     { NM_ITEM , "editMethod","E",0,0,(APTR)ID_TXTEDT   },
  51.     { NM_TITLE, "Options"  , 0 ,0,0,(APTR)0            },
  52.     { NM_ITEM , "echo"     ,"H",0,0,(APTR)ID_ECHO      },
  53.     { NM_ITEM , "bytecodes","Y",NM_ITEMDISABLED,0,(APTR)ID_BYTES     },
  54.     { NM_END  , NULL       , 0 ,0,0,(APTR)0            },
  55. };
  56.  
  57. struct NewMenu browserMenu[] =
  58. {
  59.     { NM_TITLE, "Project"  , 0 ,0,0,(APTR)0            },
  60.     { NM_ITEM , "About..." ,"?",0,0,(APTR)ID_ABOUT     },
  61.     { NM_ITEM , "Browser"  ,"B",0,0,(APTR)ID_QUITBR    },
  62.     { NM_ITEM , "fileIn"   ,"I",0,0,(APTR)ID_FILEIN    },
  63.     { NM_ITEM , "fileOut"  ,"O",0,0,(APTR)ID_FILEOUT   },
  64.     { NM_ITEM , "saveImage","S",0,0,(APTR)ID_SAVEIMG   },
  65.     { NM_ITEM , NM_BARLABEL, 0 ,0,0,(APTR)0            },
  66.     { NM_ITEM , "Quit"     ,"Q",0,0,(APTR)MUIV_Application_ReturnID_Quit },
  67.     { NM_TITLE, "Edit"     , 0 ,0,0,(APTR)0            },
  68.     { NM_ITEM , "addClass" ,"C",0,0,(APTR)ID_ADDCLS    },
  69.     { NM_ITEM , "addMethod","M",0,0,(APTR)ID_ADDMTH    },
  70.     { NM_ITEM , "editMethod","E",0,0,(APTR)ID_TXTEDT   },
  71.     { NM_TITLE, "Options"  , 0 ,0,0,(APTR)0            },
  72.     { NM_ITEM , "echo"     ,"H",0,0,(APTR)ID_ECHO      },
  73.     { NM_ITEM , "bytecodes","Y",0,0,(APTR)ID_BYTES     },
  74.     { NM_END  , NULL       , 0 ,0,0,(APTR)0            },
  75. };
  76.  
  77. /* Pointers for some MUI objects */
  78. APTR AP_Small;
  79. APTR LV_Classes, LV_Methods, LV_Text, LV_Console;
  80. APTR ST_Console;
  81.  
  82. VOID stccpy(char *dest,char *source,int len)
  83. {
  84.         strncpy(dest,source,len);
  85.         dest[len-1]='\0';
  86. }
  87.  
  88. APTR * CreateApp( void )
  89. {
  90.     APTR * App;
  91.  
  92.     App = ApplicationObject,
  93.         MUIA_Application_Author, "David Faught",
  94.         MUIA_Application_Base, "STMUI",
  95.         MUIA_Application_Title, "Smalltalk",
  96.         MUIA_Application_Version, "$VER: LittleSmalltalk 3.09 (8.27.95)",
  97.         MUIA_Application_Copyright, "Public Domain, except as noted",
  98.         MUIA_Application_Description, "Amiga Little Smalltalk with MUI",
  99.  
  100.         SubWindow, wins[1] = WindowObject, MUIA_Window_Title, "Browser", MUIA_Window_ID, MAKE_ID('B','R','O','W'), MUIA_Window_Menustrip, MUI_MakeObject(MUIO_MenustripNM,browserMenu,0), WindowContents,
  101.             VGroup,
  102.                 Child, HGroup, GroupFrameT("Classes and Methods"),
  103.                     Child, LV_Classes = ListviewObject,
  104.                         MUIA_Listview_Input, TRUE,
  105.                         MUIA_Listview_List, ListObject, InputListFrame, End,
  106.                         End,
  107.                     Child, LV_Methods = ListviewObject,
  108.                         MUIA_Listview_Input, TRUE,
  109.                         MUIA_Listview_List, ListObject, InputListFrame, End,
  110.                         End,
  111.                     End,
  112.                 Child, HGroup, GroupFrameT("Method Viewer"),
  113.                     Child, LV_Text = ListviewObject,
  114.                         MUIA_Listview_Input, TRUE,
  115.                         MUIA_Listview_List, FloattextObject, MUIA_Floattext_Text, "", MUIA_Floattext_TabSize, 4, ReadListFrame, End,
  116.                         End,
  117.                     End,
  118.                 End,
  119.             End,
  120.  
  121.         SubWindow, wins[0] = WindowObject, MUIA_Window_Title, "Amiga Little Smalltalk", MUIA_Window_ID, MAKE_ID('A','L','S','T'), MUIA_Window_Menustrip, MUI_MakeObject(MUIO_MenustripNM,mainMenu,0), WindowContents,
  122.             VGroup,
  123.                 Child, LV_Console = ListviewObject,
  124.                     MUIA_Listview_Input, FALSE,
  125.                     MUIA_Listview_List, ListObject, InputListFrame, End,
  126.                     End,
  127.                 Child, ST_Console = StringObject, StringFrame, End,
  128.                 End,
  129.             End,
  130.         End;
  131.  
  132.     return( App );
  133. }
  134.  
  135. VOID failmui(char *str)
  136. {
  137.         if (AP_Small)
  138.                 MUI_DisposeObject(AP_Small);
  139.  
  140.         if (MUIMasterBase)
  141.                 CloseLibrary(MUIMasterBase);
  142.  
  143.         if (str)
  144.         {
  145.                 puts(str);
  146.                 exit(20);
  147.         }
  148.         exit(0);
  149. }
  150.  
  151. VOID initmui(VOID)
  152. {
  153.     if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)))
  154.         failmui("Failed to open "MUIMASTER_NAME".");
  155.     if (!(AP_Small = CreateApp()))
  156.         failmui("Failed to create App object.");
  157.  
  158. /* Automagically remove the browser window when the user hits the close gadget */
  159.     DoMethod(wins[1],MUIM_Notify,MUIA_Window_CloseRequest,TRUE,wins[1],3,MUIM_Set,MUIA_Window_Open,FALSE);
  160.  
  161. /* Closing the console window forces a complete shutdown of the application */
  162.     DoMethod(wins[0],MUIM_Notify,MUIA_Window_CloseRequest,TRUE,AP_Small,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  163.  
  164. /* Receive input ids from several list views */
  165.     DoMethod(LV_Classes ,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE,AP_Small,2,MUIM_Application_ReturnID,ID_NEWCLA);
  166.     DoMethod(LV_Methods ,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE,AP_Small,2,MUIM_Application_ReturnID,ID_NEWMET);
  167.     DoMethod(LV_Text    ,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE,AP_Small,2,MUIM_Application_ReturnID,ID_TXTEDT);
  168.     DoMethod(ST_Console ,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,AP_Small,2,MUIM_Application_ReturnID,ID_NEWCON);
  169.     DoMethod(wins[0]    ,MUIM_Notify,MUIA_Window_Activate,TRUE,wins[0],3,MUIM_Set,MUIA_Window_ActiveObject,ST_Console);
  170.  
  171. /* Set the TAB cycle chain for some of our windows */
  172.     DoMethod(wins[1] ,MUIM_Window_SetCycleChain,LV_Classes,LV_Methods,LV_Text,NULL);
  173.     DoMethod(wins[0] ,MUIM_Window_SetCycleChain,ST_Console,NULL);
  174. }
  175.  
  176. /* Open the console window */
  177. VOID openCons()
  178. {
  179.     set(wins[0],MUIA_Window_Open,TRUE);
  180. }
  181.  
  182. #define MAXCONLINES 200
  183. char conSave[80*MAXCONLINES];
  184. ULONG conCount = 0;
  185.  
  186. /* put a line to the console window */
  187. VOID putCons(s1)
  188. char *s1;
  189. {
  190.     ULONG conlines;
  191.  
  192.     stccpy(&conSave[80*conCount], s1, 80);
  193.     DoMethod(LV_Console, MUIM_List_InsertSingle, &conSave[80*conCount], MUIV_List_Insert_Bottom);
  194.     get(LV_Console, MUIA_List_Entries, &conlines);
  195.     while (conlines-- > MAXCONLINES) {
  196.         DoMethod(LV_Console, MUIM_List_Remove, MUIV_List_Remove_First);
  197.         }
  198.     set(LV_Console, MUIA_List_Active, MUIV_List_Active_Bottom);
  199.     if (++conCount >= MAXCONLINES) conCount = 0;
  200. }
  201.  
  202. /* put up a general requester */
  203. VOID genRequest(s1)
  204. char *s1;
  205. {
  206.     (VOID)MUI_Request(AP_Small, wins[0], 0, NULL, "OK", s1);
  207. }
  208.  
  209. /* report a fatal system error */
  210. noreturn sysError(s1, s2)
  211. char *s1, *s2;
  212. {    char buffer[1024];
  213.  
  214.     if (initial) {
  215.         ignore fprintf(stderr,"%s\n%s\n", s1, s2);
  216.         }
  217.     else {
  218.         ignore sprintf(buffer,"%s %s", s1, s2);
  219.         genRequest(buffer);
  220.         }
  221.     failmui(NULL);
  222. }
  223.  
  224. /* report a non-fatal system error */
  225. noreturn sysWarn(s1, s2)
  226. char *s1, *s2;
  227. {    char buffer[1024];
  228.  
  229.     if (initial) {
  230.         ignore fprintf(stderr,"%s\n%s\n", s1, s2);
  231.         }
  232.     else {
  233.         ignore sprintf(buffer,"%s %s", s1, s2);
  234.         putCons(buffer);
  235.         genRequest(buffer);
  236.         }
  237. }
  238.  
  239. compilWarn(selector, str1, str2)
  240. char *selector, *str1, *str2;
  241. {    char buffer[1024];
  242.  
  243.     if (initial) {
  244.         ignore fprintf(stderr,"compiler warning: Method %s : %s %s\n", 
  245.             selector, str1, str2);
  246.         }
  247.     else {
  248.         ignore sprintf(buffer,"warn: %s %s", str1, str2);
  249.         putCons(buffer);
  250.         }
  251. }
  252.  
  253. compilError(selector, str1, str2)
  254. char *selector, *str1, *str2;
  255. {    char buffer[1024];
  256.  
  257.     if (initial) {
  258.         ignore fprintf(stderr,"compiler error: Method %s : %s %s\n", 
  259.             selector, str1, str2);
  260.         }
  261.     else {
  262.         ignore sprintf(buffer,"error: %s %s", str1, str2);
  263.         putCons(buffer);
  264.         }
  265.     parseok = false;
  266. }
  267.  
  268. noreturn dspMethod(cp, mp)
  269. char *cp, *mp;
  270. {    char buffer[1024];
  271.  
  272.     if (initial) {
  273.         ignore fprintf(stderr, "%s %s\n", cp, mp);
  274.         }
  275.     else {
  276.         ignore sprintf(buffer,"%s %s", cp, mp);
  277.         putCons(buffer);
  278.         }
  279. }
  280.  
  281. givepause()
  282. {    char buffer[80];
  283.  
  284.     if (initial) {
  285.         ignore fprintf(stderr,"push return to continue\n");
  286.         ignore gets(buffer);
  287.         }
  288.     else
  289.         genRequest("ok to continue?");
  290. }
  291.  
  292. object newPoint(x, y)
  293. int x, y;
  294. {    object newObj;
  295.  
  296.     newObj = allocObject(2);
  297.     setClass(newObj, globalSymbol("Point"));
  298.     basicAtPut(newObj, 1, newInteger(x));
  299.     basicAtPut(newObj, 2, newInteger(y));
  300.     return newObj;
  301. }
  302.